package io

import (
	"fmt"
	"zeno-kv/record"
)

type IOType byte

const (
	FILE_IO IOType = 1
)

type IOManager struct {
	IOHandler *FileIO
	Index record.Index
}

func NewIOManager(ioType IOType, file string) *IOManager {
	m := &IOManager{}
	switch ioType {
	case FILE_IO:
		m.IOHandler = NewFileIO(file)
	}
	m.Index = record.NewBtree()
	return m
}

// Write 将记录写入文件
func (i *IOManager) Write(record []byte) error {
	// 1. 写入记录到active文件
	err := i.IOHandler.Write(record)
	if err != nil {
		fmt.Printf("write file err: %v\n", err)
	}
	// 2. 解码出record里需要保存到index的信息：key、valueSize、valuePos
	// 记录的前4位是CRC
	return nil
}

// Read 读取记录
func (i *IOManager) Read(key []byte) *record.Record {
	// 1. 先读取index的数据记录，得到记录的fileId、记录大小
	indexVal := i.Index.Get(key)
	fileId := indexVal.FileId 
	valuePos := indexVal.ValuePos
	ValueSize := indexVal.ValueSize
	// 2. 利用读取到的索引数据去文件中读取数据
	// 从指定file的pos位置开始，读取size大小
	return i.IOHandler.Read(fileId, valuePos, ValueSize)
}
